#include "pch.hpp"
#include "WidgetStyleIdentifier.hpp"

#include <boostext/typedefs.hpp>
#include <intsafe.h>

using namespace Engine;
using namespace Engine::Ui;




StyleIdentifier::StyleIdentifier()
{}
///////////////////////////////////////////////////////////////////////////////////////////////////

StyleIdentifier::StyleIdentifier(const QString& name, Widgets::Type type)
	: name(name)
	, type(type)
{}
///////////////////////////////////////////////////////////////////////////////////////////////////

bool StyleIdentifier::isEmpty() const
{
	return name.isEmpty();
}
///////////////////////////////////////////////////////////////////////////////////////////////////

bool StyleIdentifier::operator<(const StyleIdentifier& that) const
{
	if(name < that.name)
		return true;
	else if(name > that.name)
		return false;

	if(type < that.type)
		return true;
	else if(type > that.type)
		return false;

	return false;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

bool StyleIdentifier::operator==(const StyleIdentifier& that) const
{
	return name == that.name && type == that.type;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

StyleIdentifier StyleIdentifier::default_()
{
	return StyleIdentifier("*", Widgets::Widget);
}
///////////////////////////////////////////////////////////////////////////////////////////////////

StyleIdentifier StyleIdentifier::default_(Widgets::Type type)
{
	return StyleIdentifier("*", type);
}
///////////////////////////////////////////////////////////////////////////////////////////////////




WidgetStyleIdentifier::WidgetStyleIdentifier()
{}
///////////////////////////////////////////////////////////////////////////////////////////////////

WidgetStyleIdentifier::WidgetStyleIdentifier(const StyleIdentifier& that)
{
	this->push_back(that);
}
///////////////////////////////////////////////////////////////////////////////////////////////////

bool WidgetStyleIdentifier::isEmpty() const
{
	return size() == 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

WidgetStyleIdentifier WidgetStyleIdentifier::default_()
{
	WidgetStyleIdentifier styleId;
	styleId.push_back(StyleIdentifier("*", Widgets::Widget));
	return styleId;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

WidgetStyleIdentifier WidgetStyleIdentifier::default_(Widgets::Type type)
{
	WidgetStyleIdentifier styleId;
	styleId.push_back(StyleIdentifier("*", type));
	return styleId;
}
///////////////////////////////////////////////////////////////////////////////////////////////////




std::size_t Engine::Ui::hash_value(const StyleIdentifier& that)
{
	std::size_t seed = 0;
	boost::hash_combine(seed, that.name);
	boost::hash_combine(seed, that.type);
	return seed;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

quint32 qHash(const Engine::Ui::StyleIdentifier& that)
{
	#ifdef _WIN64
		return hash_value(that) % std::numeric_limits<uint32>::max();
	#else
		return hash_value(that);
	#endif
}
///////////////////////////////////////////////////////////////////////////////////////////////////

std::size_t Engine::Ui::hash_value(const WidgetStyleIdentifier& that)
{
	return boost::hash_range(that.begin(), that.end());
}
///////////////////////////////////////////////////////////////////////////////////////////////////

quint32 qHash(const Engine::Ui::WidgetStyleIdentifier& that)
{
	#ifdef _WIN64
		return hash_value(that) % std::numeric_limits<uint32>::max();
	#else
		return hash_value(that);
	#endif
}
///////////////////////////////////////////////////////////////////////////////////////////////////
